import json

from django.shortcuts import render

# Create your views here.
'''
判断用户名是否唯一
前端 ： 发送ajax请求
后端 ： 接受请求 ：获取用户名
        处理 ： 根据用户名，查询数据库，如果对应的词段==0 表示唯一
        响应 ： 返回json格式的数据{响应的状态码}
    路由 ： GET方式 请求的地址：/username/(?P<username>[a-zA-Z0-9_-])/count/
    步骤：
        1.接受用户名
        2.根据用户名查询数据库
        3.返回响应
'''

from django.views import View
from django.http import JsonResponse
from apps.users.models import User
import re


class UsernameCountView(View):
    def get(self, request, username):
        #     if not re.match(R'[a-zA-Z0-9_-]{5,20}',username):
        #         return JsonResponse({'code': -1,
        #                              'errmsg': '不符合要求'
        #                              })
        # 2.根据用户名查询数据库
        count = User.objects.filter(username=username).count()
        # 3.返回响应
        return JsonResponse({'code': 0,
                             'count': count,
                             'errmsg': 'ok'
                             })


class Mobile_phoneCountView(View):
    def get(self, request, telephone):
        count = User.objects.filter(mobile_phone=telephone).count()
        return JsonResponse({
            'code': 0,
            'count': count,
            'errmsg': 'ok'
        })


'''
用户注册
前端：当用户输入 账户名称 密码 确认密码 手机号 是否同意协议后，发送ajax请求
后端：
    请求: 接受json请求 ，获取数据
    判断数据是否有误，无误写入数据库
    响应： json类型的 code:0 errmsg:'ok'
    路由 POST register/
    
    步骤：
        1.接受请求 post --> json
        2.获取数据 decode josn->dict
        3.验证数据
        4.数据写入数据库
        5.返回响应  
'''


class RegisterView(View):
    def post(self, request):
        # 1.接受请求 post --> json
        body_bytes = request.body
        body_str = body_bytes.decode()
        print(body_str)
        body_dict = json.loads(body_str)
        print(body_dict)
        # 2.获取数据 decode josn->dict
        username = body_dict.get('username')
        password = body_dict.get('password')
        password2 = body_dict.get('password2')
        mobile = body_dict.get('mobile')
        allow = body_dict.get('allow')
        # 3.验证数据
        if not all([username, password, password2, mobile]) and allow:  # all全中为真则返回True
            return JsonResponse({
                'code': 400,
                'errmsg': '参数错误',
            })
        if not re.match(R'[a-zA-Z0-9_-]{5,20}', username):
            return JsonResponse({
                'code': 400,
                'errmsg': '用户名错误',
            })
        if password != password2:
            return JsonResponse({
                'code': 400,
                'errmsg': '密码不一致',
            })
        if not re.match(r'1[1-9]{1}[0-9]{9}', mobile):
            return JsonResponse({
                'code': 400,
                'errmsg': '错误的手机号',
            })
        if not allow:
            return JsonResponse({
                'code': '400',
                'errmsg': '请同意协议',
            })
        # 4.数据写入数据库
        # create_user 会自动进行密码加密 create不会进行加密
        try:
            user = User.objects.create_user(username=username, password=password, mobile_phone=mobile)
            # User.objects.create(username=username, password=password, mobile_phone=mobile)
        except Exception:
            return JsonResponse({
                'code': '500',
                'errmsg': '用户名或手机号已被注册',
            })
        # 设置session信息
        # request.session['user_id'] = user.id
        # django提供了一套 状态保持的方法
        from django.contrib.auth import login
        # request,user
        login(request, user)
        # 5.返回响应
        return JsonResponse({
            'code': '200',
            'errmsg': 'ok',
        })

    '''
    如果需求是注册成功后即表示用户认证通过，那么此时可以在注册成功后实现自动保持（注册成功即已经登陆）
    如果需求是注册成功后不表示用户认证通过，那么此时不用在注册成功后实现状态保持（注册成功，单独登录）
    实现状态的保持：
    客户端保存cookie
    服务器保存session
    '''

